// 加载配置文件
var config = require('../config.js');
var ajaxSubmited = false;

function request(url = '', data = {}, method = "GET", showToast = true, header = true) {
	return new Promise((resolve, reject) => {
		var headers = {};
		headers["Content-Type"] = header ? "application/json" : "application/x-www-form-urlencoded"
		var token = wx.getStorageSync('token');
		if (token) {
			headers['token'] = token;
		}
		wx.request({
			url: config.API_HOST + url,
			method: method,
			data: data,
			header: headers,
			success: function(res) {
				if (res.header.token) {
					wx.setStorageSync('token', res.header.token);
				}
				res = res.data;
				if (res.statusCode == 401) {
					// var userInfo=wx.getStorageSync('userInfo');
					wx.clearStorageSync();
					// wx.setStorageSync('userInfo');
					wx.redirectTo({
						url: '/pages/bindLogin/main'
					})
				} else if (res.statusCode == 200) {
					resolve(res);
				} else {
					if (showToast && res.statusInfo) {
						wx.showToast({
							title: res.statusInfo,
							icon: 'none'
						})
					}
					reject(res)
				}
			},
			fail: function(res) {
				if (showToast) {
					wx.showToast({
						title: '网络异常',
						icon: 'none'
					})
				}
				// reject(res);
			}
		});
	});
}

function requestPro(options) {
	var {
		url = '', params = {}, method = "POST", showToast = true, header = true, open = true
	} = options
	return new Promise((resolve, reject) => {
		var headers = {};
		// headers["Content-Type"] = header ? "application/json" : "application/x-www-form-urlencoded"
		headers["Content-Type"] = header ? "application/x-www-form-urlencoded" : "application/json"
		headers["X-Requested-With"] = 'XMLHttpRequest';
		var token = wx.getStorageSync('token');
		if (token) {
			headers['token'] = token;
		}
		if (open) {
			var tokenopen = wx.getStorageSync('tokenopen');
			headers['tokenopen'] = tokenopen;
		}
		wx.request({
			url: config.API_HOST + url,
			method: method,
			data: params,
			header: headers,
			success: function(res) {
				res = res.data;
				if (res.code == -9000) {
					wx.clearStorageSync();
					wx.redirectTo({
						url: '/pages/index/login1'
					})
				} else if (res.success) {
					resolve(res || '');
				} else {
					if (showToast && res.message) {
						wx.showToast({
							title: res.message,
							icon: 'none'
						})
					}
					reject(res)
				}
			},
			fail: function(res) {
				if (showToast) {
					wx.showToast({
						title: '网络异常',
						icon: 'none'
					})
				}
				// reject(res);
			}
		});
	});
}

function uploadFile(src) {
	return new Promise((resolve, reject) => {
		var token = wx.getStorageSync('token');
		var url = config.API_HOST + '/UserServer/owner/info/uploadImg'
		wx.uploadFile({
			url: url,
			filePath: src,
			name: 'imgFile',
			header: {
				"Content-Type": "multipart/form-data",
				"token": token,
			},
			success(res) {
				var res = JSON.parse(res.data);
				var param = res.param;
				resolve(param);
				var urlPath = param.url + param.filePath;
				console.warn('上传图片地址', urlPath);
			},
			fail(res) {
				// reject(res);
				console.warn('fail=chooseImage', res)
				wx.showToast({
					title: "图片上传异常:" + res.statusInfo,
					icon: 'none'
				});
			},
			complete(res) {
				console.warn('chooseImage', res)
			}
		})
	});
}

//--------------------通用方法--------------------------

//根据date格式化时间
function formatTime(date) {

	var year = date.getFullYear();
	var month = date.getMonth() + 1;
	var day = date.getDate();

	var hour = date.getHours();
	var minute = date.getMinutes();
	var second = date.getSeconds();

	return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':');
}

Date.prototype.format = function(format) {
	var o = {
		"M+": this.getMonth() + 1,
		"d+": this.getDate(),
		"h+": this.getHours(),
		"m+": this.getMinutes(),
		"s+": this.getSeconds(),
		"q+": Math.floor((this.getMonth() + 3) / 3),
		"S": this.getMilliseconds()
	};
	if (/(y+)/.test(format)) {
		format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
	}
	for (var k in o) {
		if (new RegExp("(" + k + ")").test(format)) {
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k])
				.length));
		}
	}
	return format;
};

// 当前日期格式化 yyyy-MM-dd
function newDateFormat(value) {
	var date = value ? value : new Date();
	var dateString = date.format("yyyy-MM-dd");
	return dateString;
}
// 当前日期格式化 yyyy-MM-dd
function newDateYearMonDa(value) {
	var date = value ? new Date(value.replace(/-/g, "/")) : new Date();
	var dateString = date.format("yyyy年MM月dd日");
	return dateString;
}

// 当前日期格式化 MM-dd hh:mm
function formatDayTime(value) {
	var date = value ? new Date(value.replace(/-/g, "/")) : new Date();
	var dateString = date.format("MM-dd hh:mm");
	return dateString;
}

// 当前日期格式化 yyyy-MM-dd hh:mm:ss
function formatYearDayTime(value) {
	var date = value ? new Date(value.replace(/-/g, "/")) : new Date();
	var dateString = date.format("yyyy-MM-dd hh:mm:ss");
	return dateString;
}

function formatNumber(n) {
	n = n.toString();
	return n[1] ? n : '0' + n;
}

// 格式化时间戳
function getTime(timestamp) {
	var time = arguments[0] || 0;
	var t, y, m, d, h, i, s;
	t = time ? new Date(time) : new Date();
	y = t.getFullYear(); // 年
	m = t.getMonth() + 1; // 月
	d = t.getDate(); // 日

	h = t.getHours(); // 时
	i = t.getMinutes(); // 分
	s = t.getSeconds(); // 秒

	return [y, m, d].map(formatNumber).join('-') + ' ' + [h, i, s].map(formatNumber).join(':');

}

function getDateDiff(value) {
	// var value = '2020/06/11 08:45:00';
	// var value = '2020-05-06 14:45:00';
	// console.log(value);
	value = value.replace(/-/g, "/");

	var result = "";
	var minute = 1000 * 60;
	var hour = minute * 60;
	var day = hour * 24;
	var week = day * 7;
	var month = day * 30;
	var timeDiff = new Date().getTime() - new Date(value).getTime();
	var t = new Date(value);
	var yearNow = t.getFullYear();
	var monthNow = t.getMonth() + 1;
	var datehNow = t.getDate();
	// console.log(timeDiff);
	if (timeDiff < minute) {
		result = "1" + "分钟前";
	} else if (timeDiff < hour) {
		result = "" + parseInt(timeDiff / minute) + "分钟前";
	} else if (timeDiff < day) {
		result = "" + parseInt(timeDiff / hour) + "小时前";
	} else if (timeDiff < month) {
		result = "" + parseInt(timeDiff / day) + "天前";
	} else {
		// result = "1" + "个月前";
		if (yearNow != new Date().getFullYear()) {
			result = yearNow + '-' + monthNow + '-' + datehNow;
		} else {
			result = monthNow + '月' + datehNow + '日';
		}

	}
	// console.log(result);
	return result;
}

function timeFormat(param) { //小于10的格式化函数
	return param < 10 ? '0' + param : param;
}

// 倒计时
function countDown(time, gapTime) {

	// 获取当前时间 gapTime: 本地时间与服务器时间差
	let newTime = gapTime ? new Date().getTime() - gapTime : new Date().getTime();
	// let newTime = new Date().getTime();

	// 对结束时间进行处理渲染到页面
	let endTime = new Date(time.replace(/-/g, "/")).getTime();
	let obj = null;

	// 如果活动未结束，对时间进行处理
	if (endTime - newTime > 0) {
		let time = (endTime - newTime) / 1000;
		// 获取天、时、分、秒
		let day = parseInt(time / (60 * 60 * 24));
		let hou = parseInt(time % (60 * 60 * 24) / 3600);
		let min = parseInt(time % (60 * 60 * 24) % 3600 / 60);
		let sec = parseInt(time % (60 * 60 * 24) % 3600 % 60);

		obj = {
			day: timeFormat(day),
			hou: timeFormat(hou),
			min: timeFormat(min),
			sec: timeFormat(sec)
		}
	} else { //活动已结束，全部设置为'00'
		obj = {
			day: '00',
			hou: '00',
			min: '00',
			sec: '00'
		}
	}

	return obj;
}

// 检查手机号
function checkPhoneNum(mobile) {
	if (mobile != '') {
		var tel = mobile; //获取手机号
		var telReg = !!tel.match(/^1\d{10}$/);
		//如果手机号码不能通过验证
		if (!telReg) {
			wx.showToast({
				title: '请填写正确的手机号码',
				icon: 'none'
			})
			return false;
		}
		return true;
	} else {
		wx.showToast({
			title: '请填写手机号码',
			icon: 'none'
		})
		return false;
	}
}

// 检查身份证号码
function checkIDCardNum(idcard) {
	if (idcard != '') {
		var tel = idcard; //获取身份证号码
		var telReg = !!tel.match(/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/);
		//如果身份证号码不能通过验证
		if (!telReg) {
			wx.showToast({
				title: '请填写正确的身份证号码',
				icon: 'none'
			})
			return false;
		}
		return true;
	} else {
		wx.showToast({
			title: '请填写身份证号码',
			icon: 'none'
		})
		return true;
	}
}

// 检查收货人
function checkShopName(name) {
	var self = this;
	if (name != '') {
		var tel = name; //获取身份证号码
		var telReg = !!tel.match(/^[\u4e00-\u9fa5_a-zA-Z0-9]{0,15}$/);
		//如果身份证号码不能通过验证
		if (telReg == false) {
			wx.showToast({
				title: '请输入长度不超过16的汉字、字母、数字',
				icon: 'none'
			})
			return true;
		}
		return false;
	} else {
		wx.showToast({
			title: '请输入收货人信息',
			icon: 'none'
		})
		return true;
	}
}

// 检查邮箱
function checkEmail(email) {
	var self = this;
	if (email != '') {
		var tel = email; //获取邮箱
		var telReg = !!tel.match(/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/);
		//如果邮箱不能通过验证
		if (telReg == false) {
			wx.showToast({
				title: '请填写正确的邮箱',
				icon: 'none'
			})
			return true;
		}
		return false;
	} else {
		wx.showToast({
			title: '请填写邮箱',
			icon: 'none'
		})
		return true;
	}
}

// 获取格式化日期
function getFormatDate(str) {

	// 拆分日期为年 月 日
	var YEAR = str.substring(0, 4),
		MONTH = str.substring(4, 6),
		DATE = str.slice(-2);

	// 拼接为 2016/10/02 可用于请求日期格式
	var dateDay = YEAR + "/" + MONTH + "/" + DATE;

	// 获取星期几
	var week = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
		day = new Date(dateDay).getDay();

	return {
		"dateDay": MONTH + "月" + DATE + "日 " + week[day]
	}

}


//对象深拷贝_json序列号
function jsonCopy(obj) {
	//转换成字符串再解析，就不会拷贝对应的地址指针
	var newArray = JSON.parse(JSON.stringify(obj));
	return newArray;
}

//对象深拷贝_for循环递归
function forCopy(obj) {
	function copy(obj) {
		var newobj = obj.constructor === Array ? [] : {};
		//判断是否是对象类型
		if (typeof obj !== 'object') {
			return;
		}
		//for...in遍历对象
		for (var i in obj) {
			// 判断当前i还是不是对象 ? 1遍历出来的还是个子对象，递归调用复制方法 : 2是基础类型，就直接赋值
			newobj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i];
		}
		return newobj;
	}
	var copyArray = copy(obj)
	return copyArray;
}

// 判断两个对象属性值是否相等
function isObjectValueEqual(a, b) {
	//取对象a和b的属性名
	var aProps = Object.getOwnPropertyNames(a);
	var bProps = Object.getOwnPropertyNames(b);

	//判断属性名的length是否一致
	if (aProps.length != bProps.length) {
		return false;
	}
	//循环取出属性名，再判断属性值是否一致
	for (var i = 0; i < aProps.length; i++) {
		var propName = aProps[i];

		if (a[propName] !== b[propName]) {
			return false;
		}
	}
	return true;
}

// 浮点型乘法
function accMul(a, b) {
	let c = 0
	let d = a.toString()
	let e = b.toString()
	try {
		c += a.toString().split('.')[1].length
	} catch (f) {}
	try {
		c += b.toString().split('.')[1].length
	} catch (f) {}
	return Number(d.replace('.', '')) * Number(e.replace('.', '')) / Math.pow(10, c)
}

Number.prototype.mul = function(arg) {
	return accMul(arg, this);
}

// 浮点型加法函数
function accAdd(arg1, arg2) {
	let r1, r2, m
	try {
		r1 = arg1.toString().split('.')[1].length
	} catch (e) {
		r1 = 0
	}
	try {
		r2 = arg2.toString().split('.')[1].length
	} catch (e) {
		r2 = 0
	}
	m = Math.pow(10, Math.max(r1, r2))
	return ((arg1 * m + arg2 * m) / m).toFixed(2)
}

// 金额补全两位小数
function formatAmount(value) {
	if (!value && value != 0)
		return;

	var formatValue = '',
		amount = value.toString().split(".");

	if (amount.length == 1) {
		formatValue = "¥ " + value.toString() + ".00";
		return formatValue;
	}

	if (amount.length > 1) {
		// 小数点1位追加一个0
		if (amount[1].length < 2) {
			formatValue = "¥ " + value.toString() + "0";
		}

		// 小数点2位以上截取2位
		if (amount[1].length >= 2) {
			formatValue = "¥ " + amount[0] + '.' + amount[1].substring(0, 2);
		}

		return formatValue;
	}
}

// 浮点数运算精度丢失，超过2位就保留2位小数，四舍五入 1 1.1 1.11
function formatAmountFixed(value) {

	var formatValue = '',
		amount = value.toString().split(".");

	formatValue = value;

	if (amount.length > 1) {
		// 超过2位就保留2位小数，四舍五入
		if (amount[1].length > 2) {
			formatValue = value.toFixed(2);
		}
	}
	return "¥" + formatValue;
}

// 金额补全两位小数_floor方式_不考虑四舍五入---不兼容浮动数，浮点数涉及到乘法运算，精度会丢失，
function formatAmountFloor(value) {
	// value=1234.1;//浮点数1234.1
	// 小数点2位以上截取2位
	var value = Math.floor(parseFloat(value) * 100) / 100;

	var formatValue = '',
		amount = value.toString().split(".");

	if (amount.length == 1) {
		formatValue = value.toString() + ".00";
	}

	if (amount.length > 1) {
		// 小数点1位追加一个0
		if (amount[1].length < 2) {
			formatValue = value.toString() + "0";
		}
	}
	return "¥" + formatValue;
}

// 金额补全两位小数无人民币符号
function formatAmountCount(value) {
	if (!value && value != 0)
		return;

	var formatValue = '',
		amount = value.toString().split(".");

	if (amount.length == 1) {
		formatValue = value.toString() + ".00";
		return formatValue;
	}

	if (amount.length > 1) {
		// 小数点1位追加一个0
		if (amount[1].length < 2) {
			formatValue = value.toString() + "0";
		}

		// 小数点2位以上截取2位
		if (amount[1].length >= 2) {
			formatValue = amount[0] + '.' + amount[1].substring(0, 2);
		}

		return formatValue;
	}
}

// 金额补全两位小数点 带正负显示
function formatAmountPositive(value) {
	if (!value && value != 0)
		return;

	var formatValueText = '',
		amount = value.toString().split(".");

	if (amount.length == 1) {
		if (value > 0) {
			formatValueText = "¥ +" + value.toString() + ".00";
		} else {
			formatValueText = "¥ " + value.toString() + ".00";
		}
	}

	if (amount.length > 1) {
		// 小数点1位追加一个0
		if (amount[1].length < 2) {
			if (value > 0) {
				formatValueText = "¥ +" + value.toString() + "0";
			} else {
				formatValueText = "¥ " + value.toString() + "0";
			}
		}

		// 小数点2位以上截取2位
		if (amount[1].length >= 2) {
			if (value > 0) {
				formatValueText = "¥ +" + amount[0] + '.' + amount[1].substring(0, 2);
			} else {
				formatValueText = "¥ " + amount[0] + '.' + amount[1].substring(0, 2);
			}
		}

	}

	return formatValueText;
}

// 分佣类型
function sellLvFilter(value) {
	if (!value)
		return null;

	var text = '';

	switch (parseInt(value)) {
		case 1:
			return "消费返利";
			break;
		case 2:
			return "销售提成";
			break;
		case 3:
			return "管理提成";
			break;
		case 4:
			return "分享提成"
			break;
	}

	return text;
}

//字段没有的显示为：暂无填写
function emptyCheck(value) {
	return value ? value : '暂无填写'
}

//小数转百分比
function toPercent(value) {
	return (value * 100).toFixed(0) + '%';
}

//setTimeout模拟interval
var timer = null;

function interval(func, wait = 1000) {
	let interv = function() {
		//每次上一个setTimeout使用完后
		func.call(null);
		//会创建一个新setTimeout进行递归调用interv
		timer = setTimeout(interv, wait);
		return timer;
	};
	timer = setTimeout(interv, wait);
	return timer;
}

function clearInterval() {
	if (timer) {
		clearTimeout(timer);
		timer = null;
		//因为上面交替创建了两个timer
		//在第二个timer创建后，在它生效前移除延时任务
		setTimeout(() => {
			clearTimeout(timer);
		}, 0);
	}
}

//函数限流-2s内执行一次，且在最后时刻执行
function throttle(func, wait = 2000) {
	let timeout
	return function() {
		let that = this
		let args = arguments

		if (!timeout) {
			timeout = setTimeout(function() {
				timeout = null
				func.apply(that, args)
			}, wait)
		}
	}
}

//函数节流_时间戳实现_避免2s内重复提交
var previous = 0;

function tottleOne(func, delay = 2000, funTip = () => {}) {
	var now = +new Date();
	// console.warn('now', now, previous, (now - previous))
	if (now - previous > delay) {
		previous = now;
		func.call(null);
	} else {
		funTip()
	}
}

function throttleTwo(fn, interval) {
	// 维护上次执行的时间
	let last = 0;
	return function() {
		const context = this;
		const args = arguments;
		const now = Date.now();
		// 根据当前时间和上次执行时间的差值判断是否频繁
		if (now - last >= interval) {
			last = now;
			fn.apply(context, args);
		}
	};
}


//模仿 qs.stringify()
function stringifyQs(params = {}) {
	return Object.keys(params).map(key => key + '=' + params[key]).join('&')
}

function getUserProfile() {
	var userInfo = wx.getStorageSync('userInfo')
	return new Promise((resolve, reject) => {
		if (!userInfo) {
			wx.getUserProfile({
				desc: '用于展示用户头像信息',
				success: (res) => {
					var userInfo = res.userInfo;
					wx.setStorageSync('userInfo', userInfo)
					resolve(userInfo)
				},
				complete(res) {
					console.warn('getUserProfile', res);
				},
			})
		} else {

		}
	})

}

function toast(info) {
	wx.showToast({
		title: info,
		icon: 'none',
		duration: 1200,
		mask: true
	})
}

function isEmpty(str) {
	if ([null, undefined, ""].includes(str)) {
		return true;
	}
	return false;
}


module.exports = {
	config: config,
	request: request,
	requestPro: requestPro,
	uploadFile: uploadFile,
	checkPhoneNum: checkPhoneNum,
	checkIDCardNum: checkIDCardNum,
	checkShopName: checkShopName,
	checkEmail: checkEmail,
	formatTime: formatTime,
	formatDayTime: formatDayTime,
	formatYearDayTime: formatYearDayTime,
	getDateDiff: getDateDiff,
	getTime: getTime,
	countDown: countDown,
	getFormatDate: getFormatDate,
	newDateFormat: newDateFormat,
	newDateYearMonDa: newDateYearMonDa,
	jsonCopy: jsonCopy,
	forCopy: forCopy,
	isObjectValueEqual: isObjectValueEqual,

	formatAmount: formatAmount,
	formatAmountFixed: formatAmountFixed,
	formatAmountFloor: formatAmountFloor,
	formatAmountCount: formatAmountCount,
	formatAmountPositive: formatAmountPositive,
	sellLvFilter: sellLvFilter,
	emptyCheck: emptyCheck,
	toPercent: toPercent,
	throttle: throttle,
	interval: interval,
	clearInterval: clearInterval,
	tottleOne: tottleOne,
	stringifyQs: stringifyQs,
	getUserProfile: getUserProfile,
	toast: toast,
	isEmpty: isEmpty,
}
